package com.lebang.service.task;

import com.lebang.entity.RequestHeaders;
import com.lebang.entity.member.LbbMember;
import com.lebang.entity.member.LbbMemberRecord;
import com.lebang.entity.task.TaskScreenshot;
import com.lebang.model.enums.TaskEnableResultEnum;
import com.lebang.model.enums.buss.RecordStatus;
import com.lebang.model.enums.buss.TaskStatus;
import com.lebang.model.recordback.RecordCallBack;
import com.lebang.model.taskback.CommonCallBack;
import com.lebang.model.vo.buss.TaskSearchVo;
import org.springframework.stereotype.Service;

import java.io.OutputStream;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * The interface Task service.
 *
 * @param <T> the type parameter
 * @Author: hwq
 * @Date: 2019 /5/28 9:52
 * @Version 1.4  <p>
 */
@Service
public interface TaskService<T> {

    /**
     * 领取任务
     *
     * @param memberId 会员id(唯一)
     * @param task     任务 (唯一)
     * @param requsetHeader  其他头部参数
     * @param orderId  订单id
     * @return RecordStatus record status
     */

    RecordStatus pull(String memberId, T task, RequestHeaders requsetHeader, String orderId,String taskId);

    /**
     * 提交任务
     *
     * @param memberId 会员id(唯一)
     * @param record   任务 (唯一)
     * @param task     任务类型
     * @param result   用户提交信息
     * @param sex      是否作弊
     * @return the record status
     */
    RecordStatus push(String memberId, LbbMemberRecord record, T task, String result, Integer sex);

    /**
     * 重做任务
     *
     * @param memberId 会员id(唯一)
     * @param record   the record
     * @param task     任务 (唯一)
     * @return the record status
     */
    RecordStatus redo(String memberId, LbbMemberRecord record, T task);

    /**
     * 催审任务
     *
     * @param memberId 会员id(唯一)
     * @param record   the record
     * @param task     任务 (唯一)
     * @return the record status
     */
    RecordStatus urgentTask(String memberId, LbbMemberRecord record, T task);

    /**
     * 任务详情
     *
     * @param taskId 任务id (唯一)
     * @return the t
     */
    T taskInfoByTaskId(String taskId);

    /**
     * 任务详情
     *
     * @param id 自增id (唯一)
     * @return the t
     */

    T taskInfoById(Integer id);

    /**
     * 用户任务详情,APP 端取任务详情
     *
     * @param t        任务
     * @param record   任务记录
     * @param memberId the member id
     * @param orderId  the order id
     * @return the common call back
     * @throws Exception the exception
     */
    CommonCallBack taskDetail(T t, LbbMemberRecord record, LbbMember memberId, String orderId) throws Exception;


    /**
     * 检测用户是否可以做这个任务
     *
     * @param taskid 任务taskId
     * @param imei   设备imei
     * @param userid 用户id
     * @return the TaskEnableResultEnum
     */
    TaskEnableResultEnum checkTaskEnableDoForUser(String taskid, String imei, String userid);

    /**
     * 添加任务
     *
     * @param task the task
     * @return int
     */
    int insertTask(T task);

    /**
     * 修改任务
     *
     * @param task the task
     * @return int
     */
    int updateTask(T task);

    /**
     * 删除任务
     *
     * @param task the task
     * @return int
     */
    int deleteTask(T task);


    /**
     * 审核任务
     *
     * @param list   the list
     * @param tab    the tab
     * @param status the status
     * @param remark the remark
     * @return the int
     */
    int examineAndVerify(List<String> list, String tab, String status, String remark,Integer multiple);


    /**
     * @param memberId     用户的ID
     * @param page         分页，第几页
     * @param size         条数
     * @param brand        手机的品牌渠道
     * @param showHomePage 是否在首面显示
     * @return 任务列表
     */
    List<RecordCallBack> showListForApp(String memberId, Integer page, Integer size, String brand, Integer showHomePage, String imei, String params);

    /**
     * 任务列表
     *
     * @param page  页数
     * @param limit 条数
     * @return List list
     */
    List<T> taskList(Integer page, Integer limit);

    /**
     * 列表
     *
     * @param vo the vo
     * @return the map
     * <p>
     *
     */
    Map<String, Object> list(TaskSearchVo vo);

    /**
     * 加载每日任务方法
     * @return
     */
    boolean starTaskAmount(LocalDateTime dateTime);

    /**
     *
     * @param taskId 任务的ID
     * @param outputStream 输出流
     * @param taskStatusList 任务的状态集
     * @return
     */
    Boolean exportTaskRecode(String taskId, OutputStream outputStream, List<TaskStatus> taskStatusList);

    /**
     *
     *  释放任务
     *
     * @param record 任务记录
     */
    void releaseTask(LbbMemberRecord record);

    /**
     * 重载单个任务并且校准成功数
     * @param task
     * @return
     */
    boolean taskInitByTaskId(T task);

}
